package com.huihe.sys.controller;


import com.huihe.common.utils.TokenUtils;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.util.HashMap;
import java.util.Map;

@RestController
public class WeChatLoginController {

    /**
     * 微信小程序appId
     */
    @Value("${wx.miniapp.configs.appid}")
    private String appid;

    /**
     * 微信小程序appSecret
     */
    @Value("${wx.miniapp.configs.secret}")
    private String secret;

    /**
     * 登录接口
     * @param code 前端传来的code
     * @return Token
     */
    @PostMapping("/weChatLogin")
    public String weChatLogin(@RequestBody String code){
        // 1.请求微信官方API,对用户进行验证
        RestTemplate restTemplate = new RestTemplate();
        String basePath = "https://api.weixin.qq.com/sns/jscode2session";
        String url = UriComponentsBuilder.fromUriString(basePath)
                .queryParam("appid", appid)
                .queryParam("secret", secret)
                .queryParam("js_code", code)
                .queryParam("grant_type", "authorization_code")
                .toUriString();
        ApiReturnData apiReturnData = restTemplate.getForObject(url, ApiReturnData.class);
        // 2.生成Token
        Map<String, Object> map = new HashMap<>();
        map.put("session_key", apiReturnData.getSession_key());
        return TokenUtils.createToken(map);
    }

    @Data
    static class ApiReturnData{

        /**
         * 会话密钥
         */
        private String session_key;

        /**
         * 用户在开放平台的唯一标识符，若当前小程序已绑定到微信开放平台账号下会返回
         */
        private String unionid;

        /**
         * 错误信息
         */
        private String errmsg;

        /**
         * 用户唯一标识
         */
        private String openid;

        /**
         * 错误码
         */
        private String errcode;
    }
}
